package ar.com.gals.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import ar.com.gals.constants.Page;
import ar.com.gals.domain.Usuario;
import ar.com.gals.error.GalsException;
import ar.com.gals.model.BuscadorNegocioModel;
import ar.com.gals.model.NegocioModel;

@Controller
public class NegocioController extends AbstractController {

	@PreAuthorize("hasRole('EDNEGO')")
    @RequestMapping(value = "/GestionNegocios", method = RequestMethod.GET)
    public String gestionDeUsuarios(Model model) {
    	try 
		{
			BuscadorNegocioModel negocioModel = new BuscadorNegocioModel();
			List<Usuario> lista = negocioModel.getNegocios();
			
			model.addAttribute("usuarios", lista);
			model.addAttribute("model", negocioModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.GESTION_NEGOCIOS;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }
    
    
	@PreAuthorize("hasRole('EDNEGO')")
    @RequestMapping(value = "/GestionNegocios", method = RequestMethod.POST)
    public String gestionDeUsuarios(
    		@ModelAttribute("model") @Valid BuscadorNegocioModel negocioModel, 
    		BindingResult result, 
    		Model model)
    {
    	try 
		{
    		List<Usuario> lista = negocioModel.getNegocios();
    		
			model.addAttribute("usuarios", lista);
			model.addAttribute("model", negocioModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.GESTION_NEGOCIOS;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }
    
    
	@PreAuthorize("hasRole('EDNEGO')")
    @RequestMapping(value = "/GestionNegocios/Alta", method = RequestMethod.GET)
    public String altaUsuario(Model model) {
    	try 
		{
    		NegocioModel negocioModel = new NegocioModel();
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("action", "A");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_NEGOCIO;
		}
    }
    
    
	@PreAuthorize("hasRole('EDNEGO')")
    @RequestMapping(value = "/GestionNegocios/Alta", method = RequestMethod.POST)
    public String altaUsuario(
    		@ModelAttribute("model") @Valid NegocioModel negocioModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", negocioModel);
				model.addAttribute("provincias", negocioModel.getProvincias());
				model.addAttribute("localidades", negocioModel.getLocalidades());
				model.addAttribute("action", "A");
				model.addAttribute("function", "G");
				return Page.EDICION_NEGOCIO;
			}
			
			negocioModel.crearUsuario();
		}
		catch(GalsException ex) {
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "A");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}
		
		model.addAttribute("messageResult", "El negocio se cre&oacute; exitosamente");
		return "redirect:" + Page.URL_NEGOCIO;
    }
    
    
	@PreAuthorize("hasRole('EDNEGO')")
    @RequestMapping(value = "/GestionNegocios/Modificar/{usuarioId}", method = RequestMethod.GET)
    public String modificarUsuario(@PathVariable("usuarioId") int usuarioId, Model model) {
		try 
		{
			NegocioModel negocioModel = new NegocioModel(usuarioId);
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("action", "M");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_NEGOCIO;
		}
    }

	
	@PreAuthorize("hasRole('EDNEGO')")
	@RequestMapping(value = "/GestionNegocios/Modificar/{usuarioId}", method = RequestMethod.POST)
    public String modificarUsuario(
    		@PathVariable("usuarioId") int usuarioId,
    		@ModelAttribute("model") @Valid NegocioModel negocioModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", negocioModel);
				model.addAttribute("provincias", negocioModel.getProvincias());
				model.addAttribute("localidades", negocioModel.getLocalidades());
				model.addAttribute("action", "M");
				model.addAttribute("function", "G");
				return Page.EDICION_NEGOCIO;
			}
	
			negocioModel.modificarUsuario(usuarioId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}		
		
		model.addAttribute("messageResult", "El negocio se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_NEGOCIO;
    }
	

	@PreAuthorize("hasRole('EDNEGO')")
	@RequestMapping(value = "/GestionNegocios/Eliminar/{usuarioId}", method = RequestMethod.GET)
    public String eliminarUsuario(@PathVariable("usuarioId") int usuarioId, Model model) {
		try 
		{
			NegocioModel negocioModel = new NegocioModel(usuarioId);
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("action", "B");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_NEGOCIO;
		}
    }

	
	@PreAuthorize("hasRole('EDNEGO')")
	@RequestMapping(value = "/GestionNegocios/Eliminar/{usuarioId}", method = RequestMethod.POST)
    public String eliminarUsuario(
    		@PathVariable("usuarioId") int usuarioId,
    		@ModelAttribute("model") @Valid NegocioModel negocioModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", negocioModel);
				model.addAttribute("provincias", negocioModel.getProvincias());
				model.addAttribute("localidades", negocioModel.getLocalidades());
				model.addAttribute("action", "B");
				model.addAttribute("function", "G");
				return Page.EDICION_NEGOCIO;
			}
	
			negocioModel.eliminarUsuario(usuarioId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "B");
			model.addAttribute("function", "G");
			return Page.EDICION_NEGOCIO;
		}

		model.addAttribute("messageResult", "El negocio se elimin&oacute; exitosamente");
		return "redirect:" + Page.URL_NEGOCIO;
    }
	
   
	@PreAuthorize("hasRole('EDPERF')")
    @RequestMapping(value = { "/Perfil/Administrador", "/Perfil/Negocio" }, method = RequestMethod.GET)
    public String editarPerfil(Model model) {
		try 
		{
			NegocioModel negocioModel = new NegocioModel(this.getUsuario().getId());
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("action", "M");
			model.addAttribute("function", "P");
			return Page.EDICION_NEGOCIO;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }

	
	@PreAuthorize("hasRole('EDPERF')")
	@RequestMapping(value = { "/Perfil/Administrador", "/Perfil/Negocio" }, method = RequestMethod.POST)
    public String editarPerfil(
    		@ModelAttribute("model") @Valid NegocioModel negocioModel, 
    		BindingResult result, 
    		Model model) throws GalsException 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", negocioModel);
				model.addAttribute("provincias", negocioModel.getProvincias());
				model.addAttribute("localidades", negocioModel.getLocalidades());
				model.addAttribute("action", "M");
				model.addAttribute("function", "P");
				return Page.EDICION_NEGOCIO;
			}
	
			Usuario usuario = negocioModel.editarPerfil(this.getUsuario().getId());
			this.setUsuario(usuario);
		}
		catch(GalsException ex) {
			model.addAttribute("model", negocioModel);
			model.addAttribute("provincias", negocioModel.getProvincias());
			model.addAttribute("localidades", negocioModel.getLocalidades());
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			model.addAttribute("function", "P");
			return Page.EDICION_NEGOCIO;
		}		
		
		model.addAttribute("messageResult", "El perfil se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_INIT;
    }
	
}
